/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.jjsoft.sistemafacturacion.gco.ngc;

import com.jjsoft.sistemafacturacion.gco.dao.GenericController;
import com.jjsoft.sistemafacturacion.gco.mdl.Articulo;
import com.jjsoft.sistemafacturacion.gco.mdl.Proveedor;
import com.jjsoft.sistemafacturacion.gco.mdl.Proveedorarticulo;
import com.jjsoft.sistemafacturacion.gco.util.ArticuloValidadorException;
import com.jjsoft.sistemafacturacion.gco.util.AtributoInvalidoException;
import com.jjsoft.sistemafacturacion.gco.util.IdDuplicadoException;
import com.jjsoft.sistemafacturacion.gco.util.ValidarAtributoUtil;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Johnny
 */
public class ArticuloManager {

    GenericController<Articulo> controladorArticulo = new GenericController<Articulo>();

    public void crearProducto(Articulo producto, List<Proveedor> proveedores) throws ArticuloValidadorException {
        try {
            ValidarAtributoUtil.validarObjetoNulo("Producto", producto);
            ValidarAtributoUtil.validarStringNuloVacio("Código", producto.getCodigo());
            ValidarAtributoUtil.validarStringNuloVacio("Descripción", producto.getDescripcion());
            ValidarAtributoUtil.validarDoubleNegativo("P. Venta", producto.getPVenta());
            
            if (controladorArticulo.create(producto).equals("1")) {
                throw new ArticuloValidadorException(new IdDuplicadoException("Ya existe un producto con ese código", producto.getCodigo()));
            }
            
            if (proveedores != null && !proveedores.isEmpty()) {
                GenericController<Proveedorarticulo> controladorPP = new GenericController<Proveedorarticulo>();
                for (int i = 0; i < proveedores.size(); i++) {
                    Proveedorarticulo agregar = new Proveedorarticulo();
                    agregar.setIdArticulo(producto);
                    agregar.setIdProveedor(proveedores.get(i));
                    controladorPP.create(agregar);
                }

            }
        } catch (AtributoInvalidoException ex) {
            throw new ArticuloValidadorException(ex);
        } catch (Exception ex) {
            throw new ArticuloValidadorException("Error Desconocido " + ex.getLocalizedMessage());
        }

    }

    public void editarProducto(Articulo producto, List<Proveedor> proveedores) throws ArticuloValidadorException {
        try {
            ValidarAtributoUtil.validarObjetoNulo("Producto", producto);
            ValidarAtributoUtil.validarStringNuloVacio("Código", producto.getCodigo());
            ValidarAtributoUtil.validarStringNuloVacio("Descripción", producto.getDescripcion());
            ValidarAtributoUtil.validarDoubleNegativo("P. Venta", producto.getPVenta());
            GenericController<Proveedorarticulo> controladorPP = new GenericController<Proveedorarticulo>();
            for (int i = 0; i < producto.getProveedorarticuloList().size(); i++) {
                controladorPP.destroy(new Proveedorarticulo(), producto.getProveedorarticuloList().get(i).getIdproveedorarticulo());
            }
            if (proveedores != null && !proveedores.isEmpty()) {

                for (int i = 0; i < proveedores.size(); i++) {
                    Proveedorarticulo agregar = new Proveedorarticulo();
                    agregar.setIdArticulo(producto);
                    agregar.setIdProveedor(proveedores.get(i));
                    controladorPP.create(agregar);
                }

            }
        } catch (AtributoInvalidoException ex) {
            throw new ArticuloValidadorException(ex);
        } catch (Exception ex) {
            throw new ArticuloValidadorException("Error Desconocido " + ex.getLocalizedMessage());
        }
    }
    
    public void reducirStock(Articulo articulo, int stock)
    {
        articulo.setStock(articulo.getStock()-stock);
        try {
            controladorArticulo.edit(articulo);
        } catch (Exception ex) {
            Logger.getLogger(ArticuloManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public List<Articulo> listarArticulos() {
        List<Articulo> listaArticulos = controladorArticulo.findWhere(new Articulo(), "Estado=0");
        if (listaArticulos != null) {
            
            return listaArticulos;
        }
        return null;
    }
    
    
    public List<Articulo> listarArticulos(String criterio) {
        List<Articulo> listaProducto = controladorArticulo.findHibernateSearch(new Articulo(), criterio, "codigo", "descripcion", "marca", "modelo");
        for (int i = listaProducto.size(); i > 0; i--) {
            if (listaProducto.get(i - 1).getEstado() == 1) {
                listaProducto.remove(i - 1);
            }
        }
        return listaProducto;
    }

    public void eliminarArticulo(Articulo articulo) {
        articulo.setEstado(1);
        try {
            controladorArticulo.edit(articulo);
        } catch (Exception ex) {
        }
    }

    public Articulo buscarPorCodigo(String codigo) {
        try {
            Articulo articulo = controladorArticulo.findWhere(new Articulo(), "codigo='" + codigo + "' and estado=0").get(0);
            return articulo;
        } catch (Exception ex) {
            return null;
        }
    }

    public int buscaCodigo() {
        try {
            int codigo = controladorArticulo.findEntities(1, controladorArticulo.getCount(new Articulo()) - 1, new Articulo()).get(0).getIdarticulo().intValue() + 1;
            return codigo;
        } catch (Exception ex) {
            return 1;
        }
    }
   
}
